package concurrent;

/**
 * Created by pc on 2015/4/27.
 * 模拟在线看电影：主线程打开网页，另一个线程下载电影, 电影下载的同时主线程加载页面其它部分
 */


import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.FutureTask;
import java.util.concurrent.TimeUnit;

//@SuppressWarnings("all")
public class FutureTaskDownloadMovie {
    public static void main(String[] args) {
        // 初始化一个Callable对象和FutureTask对象
        Callable dlCallable = new DownloadMovie();
        //一个大任务，比如下载一个电影
        FutureTask<Integer> dlMovieTask = new FutureTask<Integer>(dlCallable);
        // 使用futureTask创建一个线程
        Thread dlMovieThread = new Thread(dlMovieTask, "下载电影的线程");

        long startTime = System.nanoTime();
        System.out.println("下载电影线程现在开始启动，启动时间为：" + startTime);
        dlMovieThread.start();
        System.out.println("主线程继续加载页面其它部分...");

        // 从其他账户获取总金额
//        int totalMoney = new Random().nextInt(100000);
//        System.out.println("现在你在其他账户中的总金额为" + totalMoney);

        // 测试后台的计算线程是否完成，如果未完成则等待
        while (!dlMovieTask.isDone()) {
            try {
                Thread.sleep(500);
//                System.out.println("下载中...");
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
        System.out.println("页面其它部分加载完毕.");

        long elapsed = TimeUnit.SECONDS.convert((System.nanoTime() - startTime), TimeUnit.NANOSECONDS);
        System.out.println("电影下载完毕，耗时： " + elapsed + "秒 ");
        Integer fileSize = null;
        try {
            fileSize = dlMovieTask.get();
        } catch (InterruptedException e) {
            e.printStackTrace();
        } catch (ExecutionException e) {
            e.printStackTrace();
        }
        System.out.println("电影的大小为: " + fileSize + " MB.");
        System.out.println("电影开始播放，页面加载完毕");
    }
}

//@SuppressWarnings("all")
class DownloadMovie implements Callable {
    int size = 0;

    //download movie and return size
    @Override
    public Integer call() throws Exception {
        System.out.println("开始下载4k电影.");
        Thread.sleep(1000);
        size += 1200;
        System.out.println("已下载" + size + " MB.");
        Thread.sleep(1000);
        size += 1500;
        System.out.println("已下载" + size + " MB.");
        Thread.sleep(1000);
        size += 2200;
        System.out.println("已下载" + size + " MB.");
        Thread.sleep(1000);
        size += 800;
        System.out.println("下载完毕. ");
        return size;
    }
}

